Windows10+WSL2環境で快適AWSサーバレス開発
データアナリティクス事業本部の藤川です。2020年5月下旬に、Windows 10 バージョン2004 ビルド19041(通称、May 2020 Update)が正式にリリースされました。Windows版Dockerユーザにとっては待望のWindows Updateになりました。
最近、Macで開発する方が増えていると思います。クラウド/WebサービスはLinuxで運用するケースが多く、UNIX由来のOSであるLinuxやmacOSとの親和性が高いこともあり、これらOSが開発環境として採用されるのでしょう。WebデザイナーがUIを開発し、リリースする場合、すべてのワークフローがMacで完結するでしょう。
一方、Windowsが敬遠されるケースは、Dockerを採用する場合に特に顕著です。あらゆる環境を瞬時に用意できるDockerは、コンテナ環境のOS依存性を吸収してくれますが、ホストOSをWindowsとした場合、次のようなWindowsの方言が足かせとなり、開発効率が著しく低下してしまうケースが散見されます。
- 開発者を悩ませるWindows版Dockerの課題
- ファイルシステムの違い
- パス表記(ドライブレター(C:)、パス区切り文字(\、/))が異なる
- シェルの違い
- 環境変数の表記方法(%PATH%、$PATH)が異なる
- コマンドプロンプト、PowerShell等複数あるが、互換性がない
- DockerサービスがVMで提供されている
- Dockerサービスの起動が遅い
- 無駄なリソース(特に、ディスク領域、メモリ)が必要
Hyper-V
が必要(Windows 10 Home Edition以外)VirtualBox
が必要(Windows 10 Home Edition)
- ファイルシステムの違い
そこで、May 2020 Updateの目玉である次の2機能を活用し、快適なAWS SAM CLI開発環境を構築してみようというのが本記事の主旨です。
- May 2020 Updateの注目機能
- Docker Desktop for Windows
- Windows Subsystem for Linux(WSL) 2
前提環境
- Windows 10 バージョン2004 ビルド19041(May 2020 Update)以降
Windows Subsystem for Linux
(Linux用Windowsサブシステム
)をインストール済み仮想マシン プラットフォーム
をインストール済みWSL2 Linuxカーネル更新プログラム
をインストール済み- IAMユーザ及びIAMユーザのアクセスキーが発行済み
WSL
用のLinuxディストリビューション(本記事ではUbuntu 20.04 LTS
)を使用- Windows用
git
コマンド ※Docker Desktop for Windows
インストールのために必要
前述の環境が揃っていない場合は、Windows10+WSL2環境のLinuxディストリビューションにAWS CLIをインストールしてみたで作業を済ませておいてください。
また、統合開発環境として、Microsoft Visual Studio Code
(通称、VSCode
)をインストールすると、より便利です。
ゴール
本記事では、Windows 10 Home Editionを使用し、WSL2用のUbuntu 20.04 LTS
にインストールしたAWS CLI/AWS SAM CLIをVSCodeに統合し、開発できるようにします。
インストール手順
Docker Desktop for Windowsをインストール
DockerHub
のDocker Desktop for Windowsページからインストーラをダウンロードします。インストーラを実行すると、Docker Desktop for Windows
本体をダウンロードし、インストールしてくれます。
1.Docker Desktop for Windowsを開きます。
2.Get Stable
ボタン(もしくは、Get Edge
ボタン)をクリックし、Docker Desktop Installer.exe
ファイルをダウンロードします。
3.Docker Desktop Installer.exe
ファイルをダブルクリックし、実行します。
4.Docker Desktop
のダウンロードが始まります。
5.特にチェックを変更せずに、そのままOK
ボタンをクリックします。
6.インストール(解凍)が始まります。
7.インストール(解凍)が完了したら、Close and log out
ボタンをクリックしてください。
Dockerダッシュボードを設定
Docker Desktop for Windows
のインストールが終了すると、Windowsをログオフし、再度ログオンが必要でした。Windowsにログオンすると、Dockerダッシュボード
が自動的に起動します。
1.Dockerダッシュボード
のStart
ボタンをクリックします。
2.右側にPowerShellが開きます。git clone https://github.com/docker/getting-started.git
ボタンをクリックすると、PowerShellで試せるようです。Next Step
ボタンをクリックします。
3.中央の青いボタンをクリックすると、docker101tutorial
という名称のDockerイメージ
を作成できます。Next Step
ボタンをクリックします。
4.中央の青いボタンをクリックすると、Dockerイメージ(docker101tutorial
)からdocker-tutorial
という名称のDockerコンテナ
が起動します。Next Step
ボタンをクリックします。
5.DockerHub
のアカウントをお持ちであれば、Dockerイメージ
をpush
できます。ここでは、Done
ボタンをクリックします。
6.Go directlly to the Dashboard instead
リンクをクリックします。
Docker Desktop WSL 2 backendを設定
Ubuntu
上でdocker
コマンドを利用できるようにします。
1.スタート
メニュー-Docker Desktop
をクリックし、Dockerダッシュボード
を開きます。
2.画面右上にある歯車
アイコンをクリックし、設定
画面を開きます。
3.Resources
-WSL INTEGRATION
を開きます。
4.Ubuntu-20.04
のインジケーターをクリックし、アクティブ化(青色)します。
5.画面右下にあるApply & Restart
ボタンをクリックします。
6.Docker
サービスが再起動します。
7.スタート
メニュー-Ubuntu 20.04 LTS
をクリックします。
8.Ubuntu
で次のコマンドを実行し、エラーがなければ完了です。
$ docker --version Docker version 19.03.8, build afacb8b7f0
Ubuntuを起動
VSCodeを使用しない場合
1.スタート
メニュー-Ubuntu 20.04 LTS
をクリックしてUbuntu
を起動します。
WSL2をVSCodeに統合する場合
1.VSCodeを起動し、拡張機能
を開きます。
2.「Remote - WSL
」(ms-vscode-remote.remote-wsl
)をインストールします。
3.VSCodeでリモートエクスプローラー
を開きます。
4.プルダウンでWSL Targets
を選択します。
5.一覧にUbuntu 20.04 LTS
が表示されるので、右クリックして、Connect to WSL
をクリックします。
6.VSCodeのターミナル
にUbuntu 20.04 LTS
のプロンプトが表示されます。
AWS SAM CLIをインストール
AWS SAM CLI
をWSL2
上のUbuntu
にインストールします。
LinuxへのAWS SAM CLIのインストールに従い、作業を進めます。
1.先ほど開いたUbuntu
で作業します。依存パッケージをインストールします。
$ sudo apt install gcc
2.Docker
はインストール済みなので、「ステップ 4:Homebrew のインストール」から実行します。
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
3.Homebrew
にPATHを通します。ここでは、Ubuntu
を使用しているのですが、~/.profile
に追記されます。
$ test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv) $ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) $ test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile $ echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
4.Homebrew
がインストールされたことを確認します。
$ brew --version
5.AWS SAM CLI
をインストールします。
$ brew tap aws/tap $ brew install aws-sam-cli
6.AWS SAM CLI
がインストールされたことを確認します。
$ sam --version SAM CLI, version 0.52.0
サンプルアプリケーションを使用
サンプルアプリケーションをデプロイします。 チュートリアル:Hello Worldアプリケーションのデプロイに従い、作業します。
プロジェクトフォルダを作成
1.AWS SAMのプロジェクトフォルダを新規作成します。
$ sam init --name sam-app --runtime python3.8 --dependency-manager pip --app-template hello-world
2.次のようなプロファイルでプロジェクトフォルダが作成されました。
----------------------- Generating application: ----------------------- Name: sam-app Runtime: python3.8 Dependency Manager: pip Application Template: hello-world Output Directory: .
サンプルアプリケーションを起動
1.sam local invoke
コマンドを実行すると、Dockerイメージ(ここでは、lambci/lambda:python3.8
にサンプルアプリケーションがデプロイされて、起動します。
$ cd sam-app $ sam local invoke
Invoking app.lambda_handler (python3.8) Fetching lambci/lambda:python3.8 Docker container image... (中略) Mounting /home/sshuser/work/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container START RequestId: cffffc90-58da-1c62-2db6-223559b1e5c7 Version: $LATEST END RequestId: cffffc90-58da-1c62-2db6-223559b1e5c7 REPORT RequestId: cffffc90-58da-1c62-2db6-223559b1e5c7 Init Duration: 1218.41 ms Duration: 12.41 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 30 MB {"statusCode":200,"body":"{\"message\": \"hello world\"}"} ← アプリケーションの実行結果
AWSにデプロイ
ここからはオマケみたいなものです。ローカルのDocker環境で動作確認した上で、AWS SAM CLIでAWSにデプロイできます。
1.AWSにデプロイする場合は次のコマンドを実行してください。
$ sam deploy --guided --stack-name sam-app --region ap-northeast-1 --profile hogehoge
2.画面出力されるテキストの末尾を控えておいてください。
CloudFormation outputs from deployed stack ------------------------------------------------------------------------------------------------- Outputs ------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::xxxxxxxxxxxxxx:role/sam-app-HelloWorldFunctionRole-Y4PCCVYF8LZ7 Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://128swv9rci.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxx:function:sam-app- HelloWorldFunction-1ESHSYIG5PQIG ------------------------------------------------------------------------------------------------- Successfully created/updated stack - sam-app in ap-northeast-1
動作確認
1.先ほど控えておいたテキストの中ほどにAPI GatewayのエンドポイントURLが記載されています。このURLにcurl
コマンドでアクセスします。
$ curl https://128swv9rci.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
2.分からなくなった場合は次のコマンドで取得できます。
$ aws apigateway get-rest-apis --query "items[?name=='sam-app']" --profile hogehoge
[ { "id": "128swv9rci", "name": "sam-app", "createdDate": "2020-07-07T07:07:07+09:00", "version": "1.0", "apiKeySource": "HEADER", "endpointConfiguration": { "types": [ "EDGE" ] } } ]
3.id
属性の値をFQDNの先頭にセットして、次のURLにアクセスします。
$ curl https://<id>.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
AWSから削除
1.AWSにデプロイしたサンプルアプリケーションを削除します。sam-app
という名称のCloudFormationスタックを削除します。
$ aws cloudformation delete-stack --stack-name sam-app --profile hogehoge
さいごに
VirtualBox
が不要となり、Docker自体が非常に軽くなりました。Windows環境でも、AWS CLI/AWS SAM CLIを快適に利用できるようになり、作業が捗ります。